/* 1. 组装 xml */
// 1. 组装 xml 格式的数据
  var xmlObj = {
    name: 'person', // 组装为 xml 后的标签名称
    childs: [{
      name: 'zhangsan', // 组装为 xml 后的标签名称
      text: "张<三和>和&和'和\"", // 组装为 xml 后的文本标签值 escape
      attr: {
        name: "张三"
      } // 配置属性
    }], // 子节点(优先于 cdata)
    attr: {
      id: 'person',
      name: 'Person'
    } // 配置属性
  };

  // xml escape 字符(5大特殊字符)
  var xmlEscapeChar = {
    '<': '&lt;',
    '>': '&gt;',
    '&': '&amp;',
    "'": '&apos;',
    '"': '&quot;'
  };

  function escape(text) {
    return text.replace(/'|&|<|>|"/g, function(match) {
      return xmlEscapeChar[match];
    });
  }

  /**
   * 创建 xml 节点
   */
  function createTag(xmlOjb) {
    // 循环依次构建属性
    var attrStr = '', attr = xmlOjb.attr;
    if(attr && typeof attr === 'object') {
      for(var key in attr) {
        attrStr += (' ' + key + '="' + attr[key] + '"');
      }
    }
    // 开始和关闭节点
    var open = '<' + xmlOjb.name + attrStr + '>', close = '</' + xmlOjb.name + '>';
    var childs = xmlOjb.childs, cdata = xmlOjb.cdata, text = xmlOjb.text;
    if(childs && childs instanceof Array) {
      var childStr = '';
      childs.forEach(function(child) {
        childStr += createTag(child);
      });
      return open + childStr + close;
    } else if(cdata) {
      return 'cdata';
    } else {
      return open + escape(xmlOjb.text || '') + close;
    }
  }

  /**
   * 将 JSON 对象转换为 xml 文档字符串
   * @param xmlObj xml 文档需要的 JSON 对象
   */
  function buildXml(xmlObj) {
    var xmlVar = '<?xml version="1.0" encoding="UTF-8"?>';
    return xmlVar + createTag(xmlObj);
  }
  var xmlStr = buildXml(xmlObj);
  console.log(xmlStr);
  
  
  
  
  
/* 2. 解析 xml */
var bj = {};

  var xml = '<?xml version="1.0" encoding="ISO-8859-1"?><!-- This is a comment --><bookstore id="fdsfd" >' +
    '<book category="COOKING"><title lang="en">Everyday Italian</title>' +
    '<author>Giada De Laurentiis</author><year>2005</year><price>30.00</price></book><book category="CHILDREN">' +
    '<title lang="en">Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price>' +
    '</book><book category="WEB"><title lang="en">Learning XML</title><author>Erik T. Ray</author><year>2003</year> ' +
    '<price>39.95</price></book></bookstore>';


  var xmlStateReg = /<\s*\?xml("[^"]*"|'[^']*'|[^'">])*\?\s*>/; // 匹配 xml 声明的正则表达式
  var xmlNoteReg = /<\!--.*-->/; // 匹配住宿的正则表达式

  /**
   * 解析 xml 声明属性, 提取属性声明
   * @param state  xml 声明字符串
   */
  function parseXmlState(state) {
    var stateObj = {};
    // 提取出声明内容
    state = state.slice(state.indexOf('xml') + 4, state.lastIndexOf('?'));
    state = state.trim(); // 去除前后空格
    state = state.replace(/(\s+)|([\r\n\s]+)/g, ' '); // 去除中间部分多余空格(换行)
    state = state.split(' ');
    state.forEach(function(stateItem) {
      stateItem = stateItem.split('=');
      var stateItemValue = stateItem[1];
      stateObj[stateItem[0]] = stateItemValue.slice(1, stateItemValue.length - 1);
    });
    return stateObj;
  }

  /**
   * 解析 xml 注释, 提取注释内容
   */
  function parseXmlNote(note) {
    note = note.slice(note.indexOf('--') + 2, note.lastIndexOf('--'));
    return note;
  }

  /**
   * 解析 xml 字符串为 json 对象
   * @param xmlStr xml
   */
  function xml2json(xmlStr) {
    var xmlObj = {};
    // 正则表达式匹配出所有的标签节点
    var tags = xmlStr.match(/<("[^"]*"|'[^']*'|[^'">])*>/g);
    // 循环依次解析出节点
    var i = 0, lasti = tags.length - 1;
    while (i < lasti) {
      var tagI = tags[i];
      if(xmlStateReg.test(tagI)) { // xml 文档声明
        xmlObj.state = parseXmlState(tagI); // 解析文档声明
      } else if(xmlNoteReg.test(tagI)) { // xml 注释
        xmlObj.note = parseXmlNote(tagI); // 解析注释
      } else { // 普通节点

      }
      i++;
    }
    return xmlObj;
  }

  console.log(xml2json(xml));